package main

//1、实现对圆形、三角形、长方形求面积。
//2、利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列
import (
	"fmt"
	"math"
	"sort"
)

type Areaer interface {
	Area() float64
	GetArea() float64
}

type Shape struct {
	area float64
}

type Circle struct {
	Shape
	Radius float64
}

type Rectangle struct {
	Shape
	Length float64
	Width  float64
}

type Triangle struct {
	Shape
	Base   float64
	Height float64
}

func (s *Shape) GetArea() float64 {
	return s.area
}

func (c *Circle) Area() float64 {
	c.area = math.Pi * math.Pow(c.Radius, 2)
	return c.area
}

func (r *Rectangle) Area() float64 {
	r.area = r.Length * r.Width
	return r.area

}

func (t *Triangle) Area() float64 {
	t.area = t.Base * t.Height / 2
	return t.area
}

func main() {
	//求面积
	c := Circle{Radius: 2}
	r := Rectangle{Length: 3, Width: 2}
	t := Triangle{Base: 4, Height: 8}
	fmt.Println(c.Area(), r.Area(), t.Area())

	//面积排序
	s := []Areaer{&c, &r, &t}
	sort.Slice(s, func(i, j int) bool {
		return s[i].GetArea() < s[j].GetArea()
	})
	for _, v := range s {
		fmt.Printf("%v ", v.GetArea())
	}

}

// 阿飞老师的批改
// 1. 思维逻辑清晰，逻辑实现完整。唯一的缺点就是对PI的值处理。尽量控制一下小数的精确位数。
